// generator需要手动编写或者调用co函数 

function ajax(url) {
  return new Promise(function(resolve,reject) {
  // 发送ajax请求
  var xhr = new XMLHttpRequest()
  xhr.open('GET',url)
  // responseType H5新增, 请求过后直接拿到一个json对象
  xhr.responseType = 'json'
  // H5 请求完成过后才会执行
  xhr.onload = function() {
    // 判断请求是否成功 => resolve/reject
    if(this.status === 200){ 
      resolve(this.response)
    } else {
      reject(new Error(this.statusText))
    }
  }
  // 执行异步请求
  xhr.send()
})}
function co (generator) {
  const g = generator()
  function handleResult (result) {
    if (result.done) return
    result.value.then(data => {
      handleResult(g.next(data))
    },error => {
      g.throw(error)
    })
  }
  handleResult(g.next())  
}
function * main () {
  try {
    // 返回具有ajax调用的promise对象
    const users = yield ajax('/api/users.json')
    // 接收一下yield的返回值
    console.log(users);
    } catch (e) {
      console.log(e);
    }
}
// ES2017 async也可以扁平化的异步编程体验
// * => async 且拿到句首
// yield => await
async function mainAsync () {
  try {
    // 返回具有ajax调用的promise对象
    const users = await ajax('/api/users.json')
    // 接收一下yield的返回值
    console.log(users);
    } catch (e) {
      console.log(e);
    }
}
// 不需要配合co执行器
// 返回promise对象
// await只能出现在async内部
